package com.hboxs.asl.wechat.payment.base;

import org.apache.log4j.Logger;

/**
 * 回调处理基类<br>
 * 主要负责接收微信支付后台发送过来的数据，对数据进行签名验证<br>
 * 子类在此类基础上进行派生并重写自己的回调处理过程
 */
public abstract class WxPayNotify {
    protected Logger logger = Logger.getLogger(getClass().getName());

    /**
     * 接收从微信支付后台发送过来的数据并验证签名
     *
     * @param xml 从微信后台POST过来的数据
     * @return 微信支付后台返回的数据
     */
    public WxPayData getNotifyData(String xml) throws WxPayException {
        logger.info("Receive data from WeChat : " + xml);

        //转换数据格式并验证签名
        WxPayData data = new WxPayData();
        try {
            data.fromXml(xml);
            logger.info("Check sign success");
        } catch (WxPayException ex) {
            //若签名错误，则立即返回结果给微信支付后台
            WxPayData res = new WxPayData();
            res.setValue("return_code", "FAIL");
            res.setValue("return_msg", ex.getMessage());
            logger.info("Sign check error : " + res.toXml());
            data = res;
        }

        return data;
    }

    /**
     * 派生类需要重写这个方法，进行不同的回调处理
     *
     * @param notifyData 从微信后台POST过来的数据
     * @return 结果数据
     */
    public abstract WxPayData processNotify(WxPayData notifyData) throws WxPayException;
}
